package ejemplosVideo;

import processing.core.PApplet;
import processing.core.PImage;
import processing.video.*;

//Learning Processing
// Daniel Shiffman
// http://www.learningprocessing.com

// Exercise 16-7: Create a sketch that looks for the average location of motion. Can you have an 
// ellipse follow your waving hand? 

public class AverageLocationOfMotion extends PApplet {

	private static final long serialVersionUID = 1L;

	// Variable for capture device
	Capture video;
	// Previous Frame
	PImage prevFrame;

	// How different must a pixel be to be a "motion" pixel
	float threshold = 50;

	public void setup() {
		size(320,240);
		// Using the default capture device
		video = new Capture(this, width, height, 15);
		// Create an empty image the same size as the video
		prevFrame = createImage(video.width,video.height,RGB);
	}

	public void draw() {
		background(0);

		// You don't need to display it to analyze it!
		image(video,0,0);

		// Capture video
		if (video.available()) {
			// Save previous frame for motion detection!!
			prevFrame.copy(video,0,0,video.width,video.height,0,0,video.width,video.height);
			prevFrame.updatePixels();
			video.read();
		}

		loadPixels();
		video.loadPixels();
		prevFrame.loadPixels();

		// These are the variables we'll need to find the average X and Y
		float sumX = 0;
		float sumY = 0;
		int motionCount = 0; 

		// Begin loop to walk through every pixel
		for (int x = 0; x < video.width; x++ ) {
			for (int y = 0; y < video.height; y++ ) {
				// What is the current color
				int current = video.pixels[x+y*video.width];

				// What is the previous color
				int previous = prevFrame.pixels[x+y*video.width];

				// Step 4, compare colors (previous vs. current)
				float r1 = red(current); 
				float g1 = green(current);
				float b1 = blue(current);
				float r2 = red(previous); 
				float g2 = green(previous);
				float b2 = blue(previous);

				// Motion for an individual pixel is the difference between the previous color and current color.
				float diff = dist(r1,g1,b1,r2,g2,b2);

				// If it's a motion pixel add up the x's and the y's
				if (diff > threshold) {
					sumX += x;
					sumY += y;
					motionCount++;
				}
			}
		}

		// average location is total location divided by the number of motion pixels.
		float avgX = sumX / motionCount; 
		float avgY = sumY / motionCount; 

		// Draw a circle based on average motion
		smooth();
		noStroke();
		fill(0);
		ellipse(avgX,avgY,16,16);
	}
}
